package com.example.tests;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Random;

import com.thoughtworks.xstream.XStream;

public class ContactDataGenerator {

	public static void main(String[] args) throws IOException {
			if (args.length < 3) {
				System.out.println("Please specify parameters: <amount test data> <file> <format>");
				return;
			}
			
			int amount = Integer.parseInt(args[0]);
			File file = new File(args[1]);
			String format = args[2];
			
			if (file.exists()) {
				System.out.println("File exists, please remove it manually: " + file);
				return;
			}
			
			List<ContactData> contacts = generateRandomContacts(amount);
			if ("csv".equals(format)) {
				saveContactsToCsvFile(contacts, file);
			} else if ("xml".equals(format)) {
				saveContactsToXmlFile(contacts, file);
			} else {
				System.out.println("Unknown format" + format);
			}
		}

		public static void saveContactsToXmlFile(List<ContactData> contacts, File file) throws IOException {
			XStream xstream = new XStream();
			xstream.alias("contacts", ContactData.class);
			String xml = xstream.toXML(contacts);
			FileWriter writer = new FileWriter(file);
			writer.write(xml);
			writer.close();
		}
		
		public static List<ContactData> loadContactsFromXmlFile(File file) {
			XStream xstream = new XStream();
			xstream.alias("contacts", ContactData.class);
			return (List<ContactData>) xstream.fromXML(file);
		}

		private static void saveContactsToCsvFile(List<ContactData> contacts, File file) throws IOException {
			FileWriter writer = new FileWriter(file);
			for (ContactData contact : contacts) {
				writer.write(contact.getFirstName() + "," + contact.getLastName() + ","+ contact.getAddress1() + ","
						+ contact.getHomePhone() + "," + contact.getMobilePhone() + "," + contact.getWorkPhone() + "," 
						+ contact.getEmail() + "," + contact.getEmail2() + "," + contact.getBday() + "," 
						+ contact.getBmonth() + "," + contact.getByear() + ","
						+ contact.getAddress2() + "," + contact.getPhone2() + ",|" + "\n");
			}
			writer.close();
		}
		
		public static List<ContactData> loadContactsFromCsvFile(File file) throws IOException {
			List<ContactData> list = new ArrayList<ContactData>();
			FileReader reader = new FileReader(file);
			BufferedReader bufferedReader = new BufferedReader (reader);
			String line = bufferedReader.readLine();
			while (line != null) {
				String[] part = line.split(",");
				ContactData contact = new ContactData()
					.withFirstName(part[0])
					.withLastName(part[1])
					.withAddress1(part[2])
					.withHomePhone(part[3])
					.withMobilePhone(part[4])
					.withWorkPhone(part[5])
					.withEmail(part[6])
					.withEmail2(part[7])
					.withBday(part[8])
					.withBmonth(part[9])
					.withByear(part[10])
					.withAddress2(part[11])
					.withPhone2(part[12]);
				list.add(contact);
				line = bufferedReader.readLine();
			}
			bufferedReader.close();
			return list;
		}

		public static List<ContactData> generateRandomContacts(int amount) {
			List<ContactData> list = new ArrayList<ContactData>();
			for (int i = 0; i < amount; i++){
				Calendar calendar = Calendar.getInstance();
				calendar.setTimeInMillis(generateMillis());
				ContactData contact = new ContactData()
				.withFirstName(generateRandomString())
				.withLastName(generateRandomString())
				.withAddress1(generateRandomString())
				.withAddress2(generateRandomString())
				.withEmail("abc" + generateRandomString() + "@mail.com")
				.withBday(generateRandomBday(calendar))
				.withBmonth(generateRandomBmonth(calendar))
				.withByear(generateRandomYear(calendar))
				.withEmail2("abc" + generateRandomString() + "@mail.com")
				.withHomePhone(generateRandomPhone())
				.withMobilePhone(generateRandomPhone())
				.withPhone2(generateRandomPhone())
				.withWorkPhone(generateRandomPhone());
				list.add(contact);
			}
			return list;
			}
		
		public static String generateRandomString() {
			Random rnd = new Random();
			if(rnd.nextInt(3) == 0) {
				return  "";
			} else {
				return "test" + rnd.nextInt();
			}
		}
			
		public static String generateRandomPhone() {
				return "+7(921)" + (new Random().nextInt(8999999) + 1000000);
			}
			
		public static String generateRandomBday(Calendar calendar) {
				return "" + (calendar.get(5));
				}
			
		public static String generateRandomBmonth(Calendar calendar) {
				String[] months = new String[]{"January", "February", "March", "April", "May", "June",
						"July", "August", "September", "October", "November", "December"};
				int i = calendar.get(2);
				return months[i];
				}
			
		public static String generateRandomYear(Calendar calendar) {
				return "" + (calendar.get(1));
				}
		
		private static long generateMillis() {
			long millis = 0;
			while (millis<1 || millis>System.currentTimeMillis()) {
				millis = Long.valueOf(new Random().nextInt()) * 1000;
			}
			return millis;
		}
}
